package com.gitee.flwwsg.rpc.serialize;

/**
 * 序列化需要实现的接口
 * @param <T>
 */
public interface Serializer<T> {

    /**
     * 计算对象序列化后的长度，用于申请存放序列化数据的字节数组
     * @param entry 待序列化对象
     * @return 对象序列化后的长度
     */
    int size(T entry);

    /**
     * 序列化对象，将给定的对象序列化成字节数组
     * @param entry 待序列化对象
     * @param bytes 存放序列化数据的字节数组
     * @param offset 数组的偏移量，从这个位置开始写入序列化数据
     * @param length 对象序列化后的长度,即 size 方法的返回值
     */
    void serialize(T entry, byte[] bytes, int offset, int length);

    /**
     * 反序列化对象
     * @param bytes 存入序列化数据的字节数组
     * @param offset 数组偏移量
     * @param length 对象序列化的长度
     * @return 反序列化后生成的对象
     */
    T parse(byte[] bytes, int offset, int length);

    /**
     * 标识对象类型
     * @return byte
     */
    byte type();

    /**
     * 返回序列化对象类型的 Class 对象
     * @return class
     */
    Class<T> getSerializeClass();
}
